package com.example.yxweather.ui.me


import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.example.yxweather.R
import com.example.yxweather.WeatherApplication
import com.example.yxweather.base.BaseBindingActivity
import com.example.yxweather.databinding.ActChangeAvatarBinding
import com.example.yxweather.storage.TokenPreferences
import com.example.yxweather.util.AvatarUploader
import kotlinx.coroutines.launch
import kotlin.math.log

class ChangeAvatarActivity : BaseBindingActivity<ActChangeAvatarBinding>() {

    private val REQUEST_CODE_SELECT_IMAGE: Int = 2

    // 图片地址
    var imageUrl: String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setOnClickEvent()

        // 打印用户信息
        Log.d("ChangeAvatarActivity", "用户信息: ${WeatherApplication.user}")
        // 保存图片地址
        imageUrl = WeatherApplication.user.avatar
        // 调用方法 加载图片
        loadImage(imageUrl.toString())


    }

    private fun loadImage(imageUrl: String) {
        lifecycleScope.launch {
            // 使用 Glide 加载 imageUrl 对应的图片
            Glide.with(this@ChangeAvatarActivity)
                .load(imageUrl)
                .apply(
                    // 创建 RequestOptions 对象来配置图片加载选项
                    RequestOptions()
                        // 将图片裁剪为圆形显示
                        .circleCrop()
                        // 设置占位图，加载图片时显示默认头像
                        .placeholder(R.mipmap.avatar1)
                        // 设置错误图，图片加载失败时显示默认头像
                        .error(R.mipmap.avatar1)
                )
                .into(binding.ivAvatar)
        }
        // 加载成功之后 设置给 头像 id为 ivAvatar
    }

    override fun initBinding(layoutInflater: LayoutInflater): ActChangeAvatarBinding {
        return ActChangeAvatarBinding.inflate(layoutInflater)
    }

    // 添加方法 弹出 头像选择框
    fun showAvatarDialog() {
        // 弹框 标题：选择头像，选项：拍照，从相册选择，取消
        // 点击 拍照 、从相册选择，调用 对应方法，点击取消，关闭弹框
        val dialog = AlertDialog.Builder(this)
            .setTitle("选择头像")
            .setItems(arrayOf("拍照", "从相册选择", "取消")) { dialog, which ->
                when (which) {
                    0 -> {
                        // 拍照
                        takePhoto()
                    }

                    1 -> {
                        // 从相册选择
                        selectFromAlbum()
                    }

                    2 -> {
                        // 取消
                        dialog.dismiss()
                    }
                }
            }
            .show()
    }

    fun takePhoto() {

    }

    /**
     * 从相册中选择图片或文件
     *
     * 此函数用于启动相册选择器，允许用户从设备相册中选择图片或其他文件。
     * 具体实现可能涉及启动系统相册应用或自定义的选择界面。
     */

    // 使用新的 Activity Result API 替代 startActivityForResult
    private val imagePickerLauncher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result ->
        // 处理选择图片后的结果
        if (result.resultCode == RESULT_OK) {
            // 获取用户选择的图片 URI
            val selectedImageUri: Uri? = result.data?.data

            // 如果成功获取到 URI，则加载并显示图片
            selectedImageUri?.let { uri ->
                // 将图片 上传到 接口服务器，将回传的地址设置给 用户头像
                // 保存上下文对象
                var ctx = this@ChangeAvatarActivity
                AvatarUploader(
                    ctx,
                    TokenPreferences.getInstance(ctx).getToken().toString(),
                    { url, error ->
                        if (error == null) {
//                            Toast.makeText(this, url, Toast.LENGTH_SHORT).show()
//                            Log.d("AvatarUploader", "上传成功")
                            imageUrl = url
                            // 更新一下 用户界面的头像
//                            WeatherApplication.user.avatar = url.toString()
                            loadImage(imageUrl.toString())
                        } else {
                            // 上传失败
                            Toast.makeText(this, "上传失败", Toast.LENGTH_SHORT).show()
                        }
                    }
                )
                    .uploadAvatar(uri)

            }
        }
    }

    /**
     * 从相册中选择图片或文件
     *
     * 此函数用于启动相册选择器，允许用户从设备相册中选择图片或其他文件。
     * 具体实现可能涉及启动系统相册应用或自定义的选择界面。
     */
    fun selectFromAlbum() {
        // 拉起相册，只允许选择图片，只允许选择一张
        // 获取用户选择的图片，并设置到页面中
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        intent.type = "image/*"
        // 使用新的 Activity Result API 启动相册选择
        imagePickerLauncher.launch(intent)
    }

    /**
     * 设置点击事件
     */
    fun setOnClickEvent() {
        binding.ivBack.setOnClickListener { finish() }
        // 给头像 ivAvatar 和编辑按钮ivEditAvatar 绑定同一个点击事件
        binding.ivAvatar.setOnClickListener { showAvatarDialog() }
        binding.ivEditAvatar.setOnClickListener { showAvatarDialog() }
    }
}